package com.cloudlead.common.persistence;

import java.io.Serializable;
import java.util.List;

import com.cloudlead.common.lang.persistence.IdEntity;
import com.mysema.query.sql.SQLQuery;
import com.mysema.query.types.OrderSpecifier;
import com.mysema.query.types.Predicate;

/**
 * 领域查询语言执行仓库
 *
 * @param <Pojo>
 * @param <ID>
 * @author dean.lu
 */
public interface QueryDslRepository<Pojo extends IdEntity<ID>, ID extends Serializable>
        extends Repository<Pojo, ID> {
    /**
     * 单值查询 {@link Predicate}.
     *
     * @param predicate
     * @return
     */
    Pojo findOne(Predicate predicate);

    /**
     * 查询所有实体 {@link Predicate} 根据指定的排序 {@link OrderSpecifier}s.
     *
     * @param predicate
     * @param orders
     * @return
     */
    List<Pojo> findAll(Predicate predicate, OrderSpecifier<?>... orders);

    /**
     * 查询所有实体 {@link Predicate} 根据指定的排序 {@link OrderSpecifier}s.
     *
     * @param predicate
     * @param offset
     * @param limit
     * @param orders
     * @return
     */
    List<Pojo> findAll(Predicate predicate, int offset, int limit,
                       OrderSpecifier<?>... orders);

    /**
     * 根据条件 {@link Predicate} 统计记录数
     *
     * @param predicate
     * @return the number of instances
     */
    long count(Predicate predicate);

    /**
     * 根据条件 {@link Predicate} 批量更新
     *
     * @param entity
     * @param predicate
     * @return
     */
    long updateAll(Pojo entity, Predicate predicate);

    /**
     * 根据条件 {@link Predicate} 批量删除
     *
     * @param predicate
     * @return
     */
    long deleteAll(Predicate predicate);

    /**
     * 执行自定义查询
     *
     * @param query
     * @return
     */
    <T> T find(Query query);

    /**
     * 自定义查询回调
     *
     * @author Dean
     */
    interface Query {
        /**
         * 在事务中执行查询
         *
         * @param sqlQuery
         * @return
         */
        <T> T queryInTransactional(SQLQuery sqlQuery);
    }

}
